package br.com.framework.persistencia.model;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.MappedSuperclass;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 * Superclasse {@link MappedSuperclass} que server de base para todas as
 * entidades que necessitam suportar exclusão lógica.
 * 
 * @author Cleber
 * 
 */
@MappedSuperclass
public abstract class AuditedEntity extends BaseEntity {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1954018514051702076L;

	/**
	 * Enum que classifica se o registro está ativo
	 * 
	 * @author Cleber
	 * 
	 */
	public enum Status {
		INACTIVE, ACTIVE;
	};

	private Date dataCriacao;
	private Date dataModificacao;

	private Status status = Status.ACTIVE;

	@Column(name = "DATA_CRIACAO", nullable = false)
	@Temporal(TemporalType.TIMESTAMP)
	public Date getDataCriacao() {
		return dataCriacao;
	}

	/**
	 * @return the {@link Status}
	 */
	@Column(name = "STATUS", nullable = false)
	@Enumerated(EnumType.ORDINAL)
	public Status getStatus() {
		return status;
	}

	/**
	 * @param status
	 */
	public void setStatus(Status status) {
		this.status = status;
	}

	/**
	 * @param dataCriacao
	 *            the dataCriacao to set
	 */
	public void setDataCriacao(Date dataCriacao) {
		this.dataCriacao = dataCriacao;
	}

	/**
	 * @param dataModificacao
	 *            the dataModificacao to set
	 */
	public void setDataModificacao(Date dataModificacao) {
		this.dataModificacao = dataModificacao;
	}

	@Column(name = "DATA_MODIFICACAO", nullable = false)
	@Temporal(TemporalType.TIMESTAMP)
	public Date getDataModificacao() {
		return dataModificacao;
	}

	@PrePersist
	public void initTimeStamps() {
		// we do this for the purpose of the demo, this lets us create our own
		// creation dates. Typically we would just set the createdOn field.
		if (dataCriacao == null) {
			dataCriacao = new Date();
		}
		dataModificacao = dataCriacao;
	}

	@PreUpdate
	public void updateTimeStamp() {
		dataModificacao = new Date();
	}

}
